/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */
class ListNode {
    val: number;
    next: ListNode | null;
    constructor(val?: number, next?: ListNode | null) {
        this.val = val === undefined ? 0 : val;
        this.next = next === undefined ? null : next;
    }
}

// l1 = [2, 4, 3];
// l1 = {
//     val: 2,
//     next: {
//         val: 4,
//         next: {
//             val: 3,
//             next: null,
//         },
//     },
// };

function addTwoNumbers(
    l1: ListNode | null,
    l2: ListNode | null
): ListNode | null {
    // 创建哑节点，简化链表操作
    const dummy = new ListNode(0);
    let current = dummy; // 指针
    let carry = 0; // 进位
    // 遍历两个链表，直到两个链表都为空且没有进位
    while (l1 || l2 || carry) {
        // 获取当前节点的值，如果链表为空则值为0
        const val1 = l1 ? l1.val : 0;
        const val2 = l2 ? l2.val : 0;
        // 计算当前节点的和以及进位
        const sum = val1 + val2 + carry;

        // 计算当前节点的值和进位
        const digit = sum % 10;
        carry = Math.floor(sum / 10);

        // 创建新节点，并将其连接到当前节点的后面
        current.next = new ListNode(digit);
        // 移动指针到下一个节点
        current = current.next;

        // 移动链表指针到下一个节点
        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;
    }
    return dummy.next;
}